package com.sbio.udiapp.net.api;

import com.sbio.udiapp.common.bean.ExpressPage;
import com.sbio.udiapp.common.bean.OutStockApply;
import com.sbio.udiapp.common.bean.OutStockVo;
import com.sbio.udiapp.common.bean.PackVo;
import com.sbio.udiapp.common.bean.SysUser;
import com.sbio.udiapp.common.bean.UdiDataDownloadPage;
import com.sbio.udiapp.net.bean.AjaxResult;
import com.sbio.udiapp.ui.model.RawMaterialListItemView;

import java.math.BigDecimal;

import io.reactivex.Observable;
import okhttp3.MultipartBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;
import retrofit2.http.Url;


public interface ApiService {

    @GET("/udi/api/hello")
    Call<AjaxResult> hello(@Query("name") String name, @Query("requestUniParam") String requestUniParam);

    @GET("/udi/api/test")
    Call<AjaxResult> testBody(@Body SysUser sysUser);

    @GET("/udi/api/rx")
    Observable<AjaxResult> rx(@Query("name") String name);

    /**
     * 装箱
     *
     * @param pack
     * @return
     */
    @POST("/udi/api/packing")
    Observable<AjaxResult> packing(@Body PackVo pack);

    /**
     * 拆箱，删除所有盒码
     *
     * @param packNo
     * @return
     */
    @POST("/udi/api/unpacking")
    Observable<AjaxResult> unpacking(@Query("packNo") String packNo);

    /**
     * 根据packNo获取boxNo列表
     *
     * @param packNo
     * @return
     */
    @GET("/udi/api/getBoxNoList")
    Observable<AjaxResult> getBoxNoList(@Query("packNo") String packNo);

    /**
     * 是否存在盒码
     *
     * @param boxCode
     * @return
     */
    @GET("/udi/api/existsBoxCode")
    Observable<AjaxResult> existsBoxCode(@Query("boxCode") String boxCode);

    /**
     * 装箱页面扫码检查合法性
     *
     * @param boxCode  当前数据
     * @param boxCode0 第0条数据
     * @param useDept  使用部门
     * @return
     */
    @GET("/udi/api/checkPackScanBoxCode")
    Observable<AjaxResult> checkPackScanBoxCode(@Query("boxCode") String boxCode, @Query("boxCode0") String boxCode0, @Query("useDept") String useDept);

    /**
     * 是否存在盒码在其他箱码中
     *
     * @param boxCode
     * @return
     */
    @GET("/udi/api/existsBoxCodeInOtherPack")
    Observable<AjaxResult> existsBoxCodeInOtherPack(@Query("boxCode") String boxCode, @Query("packNo") String packNo);


    /**
     * 出库
     *
     * @return
     */
    @POST("/udi/api/outStock")
    Observable<AjaxResult> outStock(@Body OutStockVo outStockVo);

    /**
     * 检查出库单
     *
     * @return
     */
    @GET("/udi/api/checkOutStockNumber")
    Observable<AjaxResult> checkOutStockNumber(@Query("outStockNo") String outStockNo);

    /**
     * 检查出库单
     *
     * @return
     */
    @GET("/udi/api/getOutStock")
    Observable<AjaxResult> getOutStock(@Query("outStockNo") String outStockNo);

    /**
     * 检查出库单是否能进行出库
     *
     * @return
     */
    @GET("/udi/api/checkOutStockCanOut")
    Observable<AjaxResult> checkOutStockCanOut(@Query("outStockNo") String outStockNo);

    /**
     * 检查出库单是否能进行反出库
     *
     * @return
     */
    @GET("/udi/api/checkOutStockCanUnOut")
    Observable<AjaxResult> checkOutStockCanUnOut(@Query("outStockNo") String outStockNo);

    /**
     * 检查箱码盒码
     *
     * @return
     */
    @GET("/udi/api/checkPbNo")
    Observable<AjaxResult> checkPbNo(@Query("outStockNo") String outStockNo, @Query("pbNo") String pbNo);

    /**
     * 反出库
     *
     * @return
     */
    @POST("/udi/api/unOutStock")
    Observable<AjaxResult> unOutStock(@Query("outStockNo") String outStockNo, @Query("pbNo") String pbNo);

    /**
     * 打印测试
     *
     * @return
     */
    @GET("/udi/api/printTest")
    Observable<AjaxResult> printTest();

    /**
     * 打印测试
     *
     * @return
     */
    @GET("/udi/api/apkVersion")
    Observable<AjaxResult> apkVersion();


    @GET("/udi/api/getMaterialInfoByUdi")
    Observable<AjaxResult> getMaterialInfoByUdi(@Query("udi") String udi);

    @GET("/udi/api/getAllAncestralPackNoByNo")
    Observable<AjaxResult> getAllAncestralPackNoByNo(@Query("udi") String udi);

    @GET("/udi/api/getMaterialInfoByPackNo")
    Observable<AjaxResult> getMaterialInfoByPackNo(@Query("packNo") String packNo);


    @Multipart
    @POST("/udi/api/uploadLog")
    Call<AjaxResult> uploadLog(@Part MultipartBody.Part file, @Query("deviceNo") String deviceNo);


    @POST("/login")
    Call<AjaxResult> login(@Query("username") String username, @Query("password") String password, @Query("requestUniParam") String requestUniParam);

    @POST("/auth/login2")
    Call<AjaxResult> login2(@Body Object body, @Query("requestUniParam") String requestUniParam);

    @GET("/udi/api/getStockList")
    Call<AjaxResult> getStockList(@Query("stockName") String stockName);


    @GET("/udi/api/getNextPageNo")
    Call<AjaxResult> getNextPageNo(@Query("requestUniParam") String requestUniParam);

    @GET("/udi/api/getNextPageNoByPageType")
    Call<AjaxResult> getNextPageNoByPageType(@Query("pageType") String pageType, @Query("requestUniParam") String requestUniParam);

    @POST("/udi/api/saveOutStockApply")
    Call<AjaxResult> saveOutStockApply(@Body OutStockApply outStockApply, @Query("requestUniParam") String requestUniParam);

    @POST("/udi/api/saveExpress")
    Call<AjaxResult> saveExpress(@Body ExpressPage expressPage, @Query("requestUniParam") String requestUniParam);

    @POST("/udi/api/saveUdiDataDownload")
    Call<AjaxResult> saveUdiDataDownload(@Body UdiDataDownloadPage page);

    @GET("/udi/api/getOutStockApply")
    Call<AjaxResult> getOutStockApply(@Query("pageNo") String pageNo, @Query("requestUniParam") String requestUniParam);

    @GET("/udi/api/pushBill")
    Call<AjaxResult> pushBill(@Query("pageNo") String pageNo, @Query("requestUniParam") String requestUniParam, @Query("version") Integer version);

    @POST("/udi/api/logTest")
    Call<AjaxResult> logTest(@Query("name") String name, @Query("requestUniParam") String requestUniParam);

    @GET("/udi/api/getExpressType")
    Call<AjaxResult> getExpressType(@Query("requestUniParam") String requestUniParam);

    @GET("/udi/api/printExpressDeliveryNote")
    Call<AjaxResult> printExpressDeliveryNote(@Query("pageNo") String pageNo,
                                              @Query("expressTypeId") String expressTypeId,
                                              @Query("waybillCount") Integer waybillCount,
                                              @Query("weight") Double weight,
                                              @Query("requestUniParam") String requestUniParam);

    @GET("/udi/api/havePrint2")
    Call<AjaxResult> havePrint(@Query("pageNo") String pageNo);

    /**
     * 获取udi数据下载码
     *
     * @param pageNo
     * @return
     */
    @GET("/udi/api/getUdiDataDownloadCode")
    Call<AjaxResult> getUdiDataDownloadCode(@Query("pageNo") String pageNo);


    @GET("/udi/api/pushMo")
    Observable<AjaxResult> pushMo(@Query("pbNo") String pbNo);


    @GET
    Call<ResponseBody> getImage(@Url String url);

    @GET("/udi/api/getExpressPage")
    Call<AjaxResult> getExpressPage(@Query("pageNo") String pageNo, @Query("requestUniParam") String requestUniParam);

    @GET("/udi/api/getUdiDataDownloadPage")
    Call<AjaxResult> getUdiDataDownloadPage(@Query("pageNo") String pageNo);

    @GET("/udi/api/invalidWaybill")
    @Deprecated
    Call<AjaxResult> invalidWaybill(@Query("expressNo") String expressNo);

    @GET("/udi/api/deleteInvalidWaybill2")
    Call<AjaxResult> deleteInvalidWaybill(@Query("billNo") String billNo);

    @GET("/udi/api/antiInvalidWaybill")
    Call<AjaxResult> antiInvalidWaybill(@Query("expressNo") String expressNo);

    @GET("https://compare-price.s-sbio.com/getPrice")
    Call<AjaxResult> getPrice(@Query("weight") String weight, @Query("billNo") String billNo);


    @GET("/udi/api/printRawMaterialBarcode")
    Call<AjaxResult> printRawMaterialBarcode(@Query("billNo") String billNo,
                                             @Query("seq") int seq,
                                             @Query("requestUniParam") String requestUniParam);

    /**
     * 获取收料通知单数据
     *
     * @param billNo
     * @return
     */
    @GET("/udi/api/getReceiveBill")
    Call<AjaxResult> getReceiveBill(@Query("billNo") String billNo);

    /**
     * 打印原材料
     *
     * @param rawMaterialListItemView
     * @return
     */
    @POST("/udi/api/printRawMaterial")
    Call<AjaxResult> printRawMaterial(@Body RawMaterialListItemView rawMaterialListItemView, @Query("cases") Integer cases, @Query("mantissa") Integer mantissa);

    /**
     * 打印原材料
     *
     * @param innerBarcode
     * @return
     */
    @GET("/udi/api/selectRawMaterial")
    Call<AjaxResult> selectRawMaterial(@Query("innerBarcode") String innerBarcode, @Query("billNo") String billNo);


    /**
     * 获取领料单物料信息
     *
     * @param billNo
     * @return
     */
    @GET("/udi/api/getPrdMtrl")
    Call<AjaxResult> getPrdMtrlView1(@Query("billNo") String billNo);

    /**
     * 获取原材料码数据
     *
     * @param innerBarcode
     * @return
     */
    @GET("/udi/api/getRawMaterial")
    Call<AjaxResult> getRawMaterial(@Query("innerBarcode") String innerBarcode, @Query("billNo") String billNo, @Query("moEntryId") String moEntryId, @Query("parentMaterialName") String parentMaterialName);




    /**
     * 修改领料单实发数量
     *
     * @param rawMaterialListItemView
     * @return
     */
    @POST("/udi/api/editPickMaterialQty")
    Call<AjaxResult> editPickMaterialQty(@Body RawMaterialListItemView rawMaterialListItemView, @Query("billNo") String billNo, @Query("qty") BigDecimal qty,@Query("parentMaterialNo") String parentMaterialNo);
}
